package alocador.persistencia;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import alocador.util.VerificaInvalido;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

class Persistencia {

	private static final String SEP_DIR = System.getProperty("file.separator");
	private static final String EXTENSAO = ".xml";

	private static File diretorioDados = new File("." + SEP_DIR + "dados");
	private static XStream stream;

	/**
	 * Grava um determinado Objeto em um arquivo XML
	 * 
	 * @param o
	 *            Objeto a ser serializado
	 * @param fileName
	 *            Nome do arquivo do objeto a ser gravado
	 * @return <code>true</code> se o objeto tiver sido serializado sem
	 *         problemas
	 */
	public static boolean gravar(Object o, String fileName) {
		if ((o == null) || VerificaInvalido.nome(fileName))
			return false;

		verificaExistencia();

		stream = new XStream(new DomDriver());
		FileOutputStream file;

		try {
			file = new FileOutputStream(diretorioDados + SEP_DIR + fileName
					+ EXTENSAO);

			BufferedOutputStream s = new BufferedOutputStream(file);
			stream.toXML(o, s);

			file.close();
			s.close();

		} catch (IOException e) {
			System.err.println("Ocorreu um erro ao gravar o arquivo");
			e.printStackTrace();
			return false;
		}
		return true;
	}

	/**
	 * Recupera um objeto de dentro de um arquivo XML.
	 * 
	 * @param fileName
	 *            O nome do arquivo contendo o objeto desejado
	 * @return <code>null</code> caso o arquivo nao tenha sido encontrado
	 */
	public static Object recuperar(String fileName) {
		if (VerificaInvalido.nome(fileName))
			return null;

		verificaExistencia();

		stream = new XStream(new DomDriver());
		InputStream in = null;
		Object o = null;

		try {
			in = new FileInputStream(diretorioDados + SEP_DIR + fileName
					+ EXTENSAO);
			o = stream.fromXML(in);
			in.close();

		} catch (IOException e) {
			// Nao existe arquivo para ser recuperado
			// System.err.println("Falha na leitura dos dados");

		}
		return o;
	}

	/**
	 * Verifica Existencia do Diretorio de Dados.<br>
	 * Caso nao exista, cria o mesmo
	 * 
	 */
	private static void verificaExistencia() {
		if (!diretorioDados.exists()) {
			diretorioDados.mkdir();
		}
	}

	/**
	 * Deleta um arquivo da persistencia de dados
	 * 
	 * @param fileName
	 *            O nome do arquivo a ser deletado
	 */
	public static void apagarArquivo(String fileName) {
		verificaExistencia();

		File f = new File(diretorioDados + SEP_DIR + fileName + EXTENSAO);
		f.delete();

	}
}
